<?php

require_once('include/header.php');
require_once('plugin/UtilsPlugin.php');
require_once('dao/FactoryDAO.php');
require_once('vo/ImagenesVO.php');
require_once('search/ImagenesSearchCriteria.php');

/**
 * Business logic directly reflects the use cases. The business logic deals with VOs, 
 * modifies them according to the business requirements and uses DAOs to access the persistence layer. 
 * The business logic classes should provide means to retrieve information about errors that occurred.
 * 
 * @author dintech
 *
 */
Class ImagenesLogic {
	
	var $_POST;
	var $ImagenesDAO;
	var $noticiaDAO;
	
	
	/**
	 * Constructor
	 * @param POST array $_POST
	 */
	function ImagenesLogic($post){
		$this->$_POST = $post; 
		$this->ImagenesDAO = FactoryDAO::getDao('ImagenesDAO');
		
		// *** Reemplazar por el DAO de la tabla que se quiera instanciar ***
		$this->noticiasDAO = FactoryDAO::getDao('NoticiasDAO');
	}
	
	
	/**
	 * Guarda una imagen en la DB y 
	 * copia la imagen (y su thumbnail) al directorio /images/$_POST[t]
	 * @param POST array $_POST
	 * @param FILES array $files
	 */
	function save($post, $files){

		// Genero el nombre del archivo = <idauto>_<nroimagen>.<extension>
		require_once 'plugin/FileUtilityPlugin.php';
		$extension = FileUtilityPlugin::getExtension($files['imgfile']['name']);
		
		// Genero nuevo nombre unico para la imagen
		srand(time());
		$randomCode = rand(1,10000); 
		$newFileName =  $post['iditem'] . '_' . $randomCode . "." . $extension;
		
		$imagesVO = new ImagenesVO();
		$imagesVO->setAlt($post['alt']);
		$imagesVO->setDate(Utils::getDateForDB(date("d-m-Y")));
		$imagesVO->setDescription($post['descripcion']);
		$imagesVO->setFilename($newFileName);
		$imagesVO->setHeight($post['height']); 
		$imagesVO->setId(null); 
		$imagesVO->setIditem($post['iditem']); 
		$imagesVO->setOrder($post['order']); 
		$imagesVO->setSize($files['imgfile']['size']); 
		$imagesVO->setTable($post['t']);
		$imagesVO->setWidth($post['width']);
		$result = $this->ImagenesDAO->save($imagesVO);

		// obtengo ID de la imagen recien agregada
		$newImageId = $this->ImagenesDAO->getLastInsertId();
		
		// *** Reemplazar por el DAO de la tabla que se quiera instanciar ***
		// incremento el imagecount de la noticia
		$imageSearchCriteria = new ImagenesSearchCriteria();
		$imageSearchCriteria->setIditem($post['iditem']);
		$imageSearchCriteria->setTable($post['t']);
		$images = $this->find($imageSearchCriteria);
		
		$this->ImagenesDAO->updateImageinfo($post['t'], $post['iditem'], (count($images) == 1) ? $newImageId : null, 1);
		
		if ($result != "error"){
			
			$error = false;

			// genero nombre de path y thumbnailPath
			$path = "images/".$post['t']."/". $newFileName;
			$thumbnailPath = "images/".$post['t']."/small/". $newFileName;
			
			// copia archivo al server
			if(move_uploaded_file($files['imgfile']['tmp_name'], $path)) {
			    ;
			} else{
			    $error = true;
			}
			copy($files['uploadedfile']['tmp_name'], $path);
			
			// genera thumbnail y lo copia en el path /small
			require_once 'plugin/ThumbnailPlugin.php';
			$thumb = new Thumbnail($path);
			$thumb->resize(960);
			$thumb->save($path, 100);
			$thumb = new Thumbnail($path);
	 		$thumb->resize(250);
			$thumb->save($thumbnailPath, 100);
			
			if ($error)
				return "error";
			else
				return "ok";
		}
		else 
			return $result;
		return;
	}

	
	/**
	 * Actualiza la informacion de una imagen (descripcion y default - en un futuro) 
	 * @param POST array $post
	 */
	function update($post){

		$imagesVO = new ImagenesVO();
		$imagesVO->setDescription($post['descripcion']);
		$imagesVO->setId($post['id']); 
		$result =  $this->ImagenesDAO->save($imagesVO);

		if ($post['defaultimage'] == 1)
			$this->ImagenesDAO->updateImageinfo($post['t'], $post['iditem'], $post['id'], 0);
		
		return $result;
	}
	
	
	/**
	 * Elimina una imagen de la DB y tambien fisicamente el archivo
	 * de la imagen y su thumbnail
	 * @param POST array $post
	 */
	function delete($post){

		// chequear si imagesid (FK) es igual a la que se quiere eliminar
		$noticia = $this->noticiasDAO->get($post['iditem']);

		$newImageId = null;
		$replaceImageId = false;
		
		if ($noticia[imagesid] == $post[id] && $noticia[imagecount] > 1) {

			$replaceImageId = true;
			
			// obtener otra imagen para seleccionar como la nueva imagesid (FK)
			$imageSearchCriteria = new ImagenesSearchCriteria();
			$imageSearchCriteria->setIditem($post['iditem']);
			$images = $this->find($imageSearchCriteria);
			foreach ($images as $image) {
				if ($image[id] != $post[id]) {
					$newImageId = $image[id];
					break; 
				}
			}
		}

		// elimino fisicamente la imagen y su thumbnail		
		$imagen = $this->ImagenesDAO->get($post[id]);
		$path = "images/".$imagen[tablename]."/". $imagen[filename];
		$thumbnailPath = "images/".$imagen[tablename]."/small/". $imagen[filename];
		unlink($path);
		unlink($thumbnailPath);
		
		// *** Reemplazar por el DAO de la tabla que se quiera instanciar ***
		// decremento en uno el imagecount de iditem
		$this->ImagenesDAO->updateImageinfo($post['t'], $post['iditem'], ($replaceImageId) ? $newImageId : null, -1);
		
		// elimino la imagen de la DB
		return $this->ImagenesDAO->delete($post[id]);
	}
	
	
	/**
	 * Devuelve una imagen a partir de su ID
	 * @param ID $id
	 */
	function get($id){
		return $this->ImagenesDAO->get($id);
	}
	
	
	/**
	 * Retorna todas las imagen que hagan matching
	 * con el criterio definido en $imageSearchCriterio
	 * @param ImageSearchCriteria $imageSearchCriteria
	 */
	function find($imageSearchCriteria){
		return $this->ImagenesDAO->find($imageSearchCriteria);
	}
	
	/**
	 * Retorna la cantidad de imagenes que hacen matching
	 * con el criterio definido en $imageSearchCriteria
	 * @param ImageSearchCriteria $imageSearchCriteria
	 */
    function count($imageSearchCriteria){
		return $this->ImagenesDAO->count($imageSearchCriteria);
	}
	
	/**
	 * Retorna la entidad (cualquier tabla que use el modulo de imagenes)
	 * @return Entidad 
	 */
	function getEntidad($table, $iditem) {
		return $this->ImagenesDAO->getEntidad($table, $iditem);
	}
	

	
}
?>